package cn.green.core.components.field;

import cn.green.core.components.entity.JoinInfo;
import cn.green.core.model.QCondition;
import com.alibaba.fastjson.JSONObject;
import cn.green.core.common.enums.field.ColumnType;
import cn.green.core.components.entity.ColumnLength;
import cn.green.core.excel.model.Column;
import cn.green.core.front.model.Fetch;
import cn.green.core.front.model.Input;
import cn.green.core.front.model.Title;
import cn.green.core.model.QField;
import cn.green.core.model.QTable;

import java.util.List;

/**
 * 属性类型接口
 * @author wang.yishu
 */
public interface FieldTypeCom {
    /**
     * 属性类型名称
     * @return
     */
    String fieldTypeName();

    /**
     * 属性类型
     * @return
     */
    String fieldTypeCode();

    /**
     * 字段类型
     * @return
     */
    ColumnType getColumnType();

    /**
     * 默认字段长度配置
     * @return
     */
    ColumnLength defaultColumnLength();

    /**
     * 该类型的字段是否是虚拟字段（否的话数据库表存在该字段）
     * 表不会存在虚拟字段
     * @return
     */
    default boolean isVirtual() {
        return false;
    }

    /**
     * 该类型的字段是否可以修改
     * @return true可以修改， false不可以修改
     */
    default boolean canUpdate() {return true;}

    /**
     * 该类型的字段在可以修改时，执行修改的前置操作，
     * @return true执行完该方法后可以继续，false执行完该方法后不可继续
     */
    default boolean preUpdate(QField field) {return true;}

    /**
     * 该类型的字段是否可以删除
     * @return true可以删除， false不可以删除
     */
    default boolean canDelete() {return true;}

    /**
     * 该类型的字段在可以删除时，执行删除的前置操作，
     * @return true执行完该方法后可以继续，false执行完该方法后不可继续
     */
    default boolean preDelete() {return true;}
    /**
     * 获取该字段类型的附加字段
     * @param field
     * @return
     */
    default List<QField> extraFields(QField field) {
        return null;
    }

    /**
     * 格式化数据
     * @param record
     * @param field
     */
    void formatRecord(JSONObject record, QField field);

    /**
     * 解析数据
     * @param record
     * @param field
     */
    void parseRecord(JSONObject record, QField field);

    /**
     * 获取对应字段类型所对应的输入项配置
     * @param field
     * @return
    */
    List<Input> inputs(QField field);

    /**
     * 获取对应字段类型所对应的头配置
     * @param field
     * @return
    */
    List<Title> titles(QField field);

    /**
     * 获取对应字段类型所对应的查询配置
     * @param field
     * @return
     */
    List<Fetch> fetches(QTable table, QField field);

    /**
     * 获取对应类型字段的对应的查询条件
     * @param field
     * @return
     */
    List<QCondition> conditions(QField field, JSONObject param);

    /**
     * 获取对应类型字段的表关联信息列表
     * @param table 表
     * @param field 字段
     * @return 关联信息
     */
    JoinInfo joinInfos(QTable table, QField field);

    /**
     * 该属性类型的excel列列表
     * @param field
     * @return
     */
    List<Column> columns(QField field);
}
